òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/11115

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# ¡Ծۿ£https://www.joinquant.com/post/10246
# ⣺áRSRS(֧ǿ)ʱԣϣ
# ߣJoinQuant

# 뺯
import jqdata
from jqdata import *
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import matplotlib
from pandas.stats.api import ols
import datetime
import time


# ʼ趨׼ȵ
def initialize(context):
    # 趨ָ֤Ϊ׼
    set_benchmark('000300.XSHG')
    # ̬Ȩģʽ(ʵ۸)
    set_option('use_real_price', True)
    # ݵ־ log.info()
    log.info('ʼʼȫֻһ')
    # ˵orderϵAPIıerror͵log
    # log.set_level('order', 'error')
    
    ### Ʊ趨 ###
    # ƱÿʽʱǣʱӶ֮ʱӶ֮ǧ֮һӡ˰, ÿʽӶͿ5Ǯ
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    ## кreference_securityΪʱĲοģıֻ֣˴'000300.XSHG''510300.XSHG'һģ
      # ǰ
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
      # ʱ
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # ̺
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

    # RSRSָN, Mֵ
    g.N = 18
    g.M = 480
    
    # ҪĹƱƽУg.Ϊȫֱ
    g.security = '000300.XSHG'
    
    # ֵ
    g.buy = 0.7
    g.sell = -0.7
    
    
    # ҪRSRSбָ
    # 㽻䳤(ʼǰһ)
    g.trade_date_range = len(get_trade_days(start_date = context.run_params.start_date, end_date = context.run_params.end_date)) + 1
    # ȡʱ(ʼǰһ)
    g.trade_date_series = get_trade_days(end_date = context.run_params.end_date, count = g.trade_date_range)
    # RSRSбʵʱ䳤
    g.date_range = len(get_trade_days(start_date = context.run_params.start_date, end_date = context.run_params.end_date)) + g.M
    # ȡRSRSбʵʱ
    g.date_series = get_trade_days(end_date = context.run_params.end_date, count = g.date_range)
    # RSRSбʿձ
    g.RSRS_ratio_list = Series(np.zeros(len(g.date_series)), index = g.date_series)
    # ڵRSRSбֵ
    for i in g.date_series:
        g.RSRS_ratio_list[i] = RSRS_ratio(g.N, i)
        
        
    
    # ׼RSRSָ
    # ֵ
    g.trade_mean_series =  pd.rolling_mean(g.RSRS_ratio_list, g.M)[-g.trade_date_range:]
    # ׼
    g.trade_std_series = pd.rolling_std(g.RSRS_ratio_list, g.M)[-g.trade_date_range:]
    # ׼RSRSָ
    g.RSRS_stdratio_list = Series(np.zeros(len(g.trade_date_series)), index = g.trade_date_series)
    g.RSRS_stdratio_list = (g.RSRS_ratio_list[-g.trade_date_range:] - g.trade_mean_series) /  g.trade_std_series
    #print g.RSRS_stdratio_list
        
    
  
# : RSRSбָ궨
def RSRS_ratio(N, date):
    security = g.security
    stock_price_high = get_price(security, end_date = date, count = N)['high']
    stock_price_low = get_price(security, end_date = date, count = N)['low']
    ols_reg = ols(y = stock_price_high, x = stock_price_low)
    return ols_reg.beta.x
    
    
    
    
## ǰк     
def before_market_open(context):
    # ʱ
    log.info('ʱ(before_market_open)'+str(context.current_dt.time()))

    # ΢ŷϢģ⽻ף΢Ч
    send_message('õһ~')


    

    
## ʱк
def market_open(context):
    log.info('ʱ(market_open):'+str(context.current_dt.time()))
    security = g.security
    # ȡõǰֽ
    cash = context.portfolio.available_cash

    # һʱRSRSбʴֵ, ȫ
    if g.RSRS_stdratio_list[context.previous_date] > g.buy:
        # ¼
        log.info("׼RSRSбʴֵ,  %s" % (security))
        #  cash Ʊ
        order_value(security, cash)
    # һʱRSRSбСֵ, ղ
    elif g.RSRS_stdratio_list[context.previous_date] < g.sell and context.portfolio.positions[security].closeable_amount > 0:
        # ¼
        log.info("׼RSRSбСֵ,  %s" % (security))
        # йƱ,ʹֻƱճΪ0
        order_target(security, 0)
 
## ̺к  
def after_market_close(context):
    log.info(str('ʱ(after_market_close):'+str(context.current_dt.time())))
    #õгɽ¼
    trades = get_trades()
    for _trade in trades.values():
        log.info('ɽ¼'+str(_trade))
    log.info('һ')
    log.info('##############################################################')
